package common

import (
	"errors"
	"log"
	"reflect"
	"strconv"
	"time"
)

func DataToTagSqlByTag(data map[string]string,obj interface{}) {
	objectValue := reflect.ValueOf(obj).Elem()
	for i := 0; i < objectValue.NumField(); i++ {
		// 获取 sql对应的值
		// 获取 sql tag的值(对应数据库中字段的名称)
		sqlTagName := objectValue.Type().Field(i).Tag.Get("sql")
		value := data[sqlTagName]
		// 此处name为 obj结构体中的name
		name := objectValue.Type().Field(i).Name
		// 获取结构体中的字段类型
		structFieldType := objectValue.Field(i).Type()
		// 获取value值的类型
		val := reflect.ValueOf(value)
		if structFieldType != val.Type() {
			var err error
			//  数据库类型和struct中类型不一致
			// 类型转换
			val,err = TypeConversion(value,structFieldType.Name())
			if err != nil {

				log.Printf("类型无法转换成功:" + err.Error())
			}

		}
		objectValue.FieldByName(name).Set(val)
	}
}


//类型转换
func TypeConversion(value string, ntype string) (reflect.Value, error) {
	if ntype == "string" {
		return reflect.ValueOf(value), nil
	} else if ntype == "time.Time" {
		t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)
		return reflect.ValueOf(t), err
	} else if ntype == "Time" {
		t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)
		return reflect.ValueOf(t), err
	} else if ntype == "int" {
		i, err := strconv.Atoi(value)
		return reflect.ValueOf(i), err
	} else if ntype == "int8" {
		i, err := strconv.ParseInt(value, 10, 64)
		return reflect.ValueOf(int8(i)), err
	} else if ntype == "int32" {
		i, err := strconv.ParseInt(value, 10, 64)
		return reflect.ValueOf(int64(i)), err
	} else if ntype == "int64" {
		i, err := strconv.ParseInt(value, 10, 64)
		return reflect.ValueOf(i), err
	} else if ntype == "float32" {
		i, err := strconv.ParseFloat(value, 64)
		return reflect.ValueOf(float32(i)), err
	} else if ntype == "float64" {
		i, err := strconv.ParseFloat(value, 64)
		return reflect.ValueOf(i), err
	}

	//else if .......增加其他一些类型的转换

	return reflect.ValueOf(value), errors.New("未知的类型：" + ntype)
}